clear; clc; close all
%% 导入数据
load result04_10.mat
data = result04_10;

deltaV = 0.001; % 插值步长
w = gausswin(40, 1); % 高斯低通滤波参数
w = w / sum(w);

% 初始化
num_data = length(data);
colors = parula(50); % 生成渐变颜色，每张图最多 50 条曲线

% 创建一个新的 cell 数组来存储 IC 数据
IC_data = cell(num_data, 1); % 每个 cell 存储一个循环的电压和 IC 数据

% 计算需要多少张图
num_plots = ceil(num_data / 50); % 每 50 个编号一张图

% 初始化一个逻辑数组，标记需要保留的数据
keep_data = true(num_data, 1); % 初始化为 true，表示保留所有数据

% 循环绘制每张图
for plot_idx = 1:num_plots
    figure;
    hold on;
    title(['IC 曲线 (编号 ', num2str((plot_idx-1)*50+1), ' 到 ', num2str(min(plot_idx*50, num_data)), ')']);
    xlabel('V');
    ylabel('dQdV');
    colormap(parula); % 设置渐变颜色
    colorbar; % 添加颜色条，用于指示编号对应颜色

    % 循环处理每 50 个编号的数据
    for idx = (plot_idx-1)*50 + 1 : min(plot_idx*50, num_data)
        
        % 选择要分析的数据
        x = data{idx};

        % 根据电压信号幅度，选择合适的信号片段
        V = x(:, 2);
        index = V > 2.5 & V < 3.94; % 设置V的最大和最小值，来设置数据分析范围
        index = bwlabel(index); % 获取每个连通域的属性
        props = regionprops(index, 'Area');
        % 找到最大连通域的标签
        max_area = 0;
        max_area_label = 0;
        for i = 1:max(index)
            if props(i).Area > max_area
                max_area = props(i).Area;
                max_area_label = i;
            end
        end
        index = find(index == max_area_label);
        index = index(20:end-20);

        I = x(index, 1);
        V = x(index, 2);
        Q = x(index, 3);

        % 均匀插值
        [C, ia, ic] = unique(V, 'sorted');
        V = V(ia);
        Q = Q(ia);
        VV = (min(V):deltaV:max(V))';
        QQ = interp1(V, Q, VV);
        V = VV;
        Q = QQ;

        %% 导数计算
        dV = diff(V);
        dQ = diff(Q);
        index = dV > 1e-5; % 设置dV最小值
        dV = dV(index);
        dQ = dQ(index);
        V = V(index);
        dQdV = dQ ./ dV;

        %% 数据平滑
        dQdV_filter = filtfilt(w, 1, dQdV);

        % 将电压和 IC 数据存储到新的 cell 数组中
        IC_data{idx} = [V, dQdV_filter]; % 第一列是电压，第二列是 IC 数据

        % 绘制当前编号的 IC 曲线
        plot_handle = plot(V, dQdV_filter, 'Color', colors(mod(idx-1, 50)+1, :), 'DisplayName', ['数据编号 ', num2str(idx)]);

        % 为每条曲线添加编号信息
        set(plot_handle, 'UserData', idx); % 将编号存储在曲线的 UserData 属性中
    end

    % 添加图例
    legend('Location', 'bestoutside');
    hold off;

    % 启用数据提示，并自定义数据提示内容
    dcm = datacursormode(gcf);
    set(dcm, 'UpdateFcn', @customDatatip); % 设置自定义数据提示函数

    % 提示用户输入需要删除的编号
    fprintf('当前图像编号范围: %d 到 %d\n', (plot_idx-1)*50+1, min(plot_idx*50, num_data));
    user_input = input('请输入需要删除的编号（多个编号用空格分隔，按回车跳过）: ', 's');
    if ~isempty(user_input)
        delete_indices = str2num(user_input); % 将输入转换为数字数组
        keep_data(delete_indices) = false; % 标记需要删除的数据
    end
end

% 删除用户标记的数据
IC_data = IC_data(keep_data); % 只保留标记为 true 的数据

% 保存结果数据
save('AAAAA.mat', 'IC_data');
disp('数据已保存result04_71_with_IC_filtered.mat');

%% 自定义数据提示函数
function output_txt = customDatatip(~, event_obj)
    % 获取当前数据点的坐标
    pos = get(event_obj, 'Position');
    x = pos(1); % x 坐标（电压）
    y = pos(2); % y 坐标（IC 值）

    % 获取曲线的编号
    plot_handle = get(event_obj, 'Target');
    idx = get(plot_handle, 'UserData'); % 从 UserData 中获取曲线编号

    % 设置数据提示内容
    output_txt = {
        ['编号: ', num2str(idx)], ...
        ['V: ', num2str(x)], ...
        ['dQ/dV: ', num2str(y)]
    };
end